-module(test_list).
-compile(export_all).

main() ->   
    test_concat(),
    test_flatten(),
    test_append_tail(),
    test_append_header().

test_concat() ->
    statistics(wall_clock),
    test_concat(100000).

test_concat(0) ->
    {_, Duration} = statistics(wall_clock),
    io:format("Concat Duration ~pms~n", [Duration]),
    ok;
test_concat(N) ->
    "<title>" ++ integer_to_list(N) ++ "</title>",
    test_concat(N-1).

test_flatten() ->
    statistics(wall_clock),
    test_flatten(100000).

test_flatten(0) ->
    {_, Duration} = statistics(wall_clock),
    io:format("Flatten Duration ~pms~n", [Duration]),
    ok;
test_flatten(N) ->
    lists:flatten(["<title>", integer_to_list(N), "</title>"]),
    test_flatten(N-1).

test_append_tail() ->
    statistics(wall_clock),
    test_append_tail(100000).

test_append_tail(0) ->
    {_, Duration} = statistics(wall_clock),
    io:format("Append tail Duration ~pms~n", [Duration]),
    ok;
test_append_tail(N) ->
    append_last([], 97, 122),
    test_append_tail(N-1).

append_last(List, N, N) ->
    List ++ [N];
append_last(List, Curr, N) ->
    append_last(List++[Curr], Curr+1, N).

test_append_header() ->
    statistics(wall_clock),
    test_append_header(100000).

test_append_header(0) ->
    {_, Duration} = statistics(wall_clock),
    io:format("Append header Duration ~pms~n", [Duration]),
    ok;
test_append_header(N) ->
    append_header_and_reverse([], 97, 122),
    test_append_header(N-1).

append_header_and_reverse(List, N, N) ->
    lists:reverse([N|List]);
append_header_and_reverse(List, Curr, N) ->
    append_header_and_reverse([Curr|List], Curr+1, N).
